/**
 * 编写一个函数，函数有两个参数，这个两个参数的类型是一样的，将两个参数存放到数组中进行返回
 */
// function foo1(arg1:number,arg2:number):number[]{
//     return [arg1,arg2]
// }
// function foo2(arg1:string,arg2:string):string[]{
//     return [arg1,arg2]
// }
// function foo3(arg1:boolean,arg2:boolean):boolean[]{
//     return [arg1,arg2]
// }
/*
    如果使用any的方式存在两个问题
    1、取消掉了ts的检测机制
    2、你确保不了这两个参数的类型是一致的
*/
// function foo1(arg1:any,arg2:any):any[]{
//     return [arg1,arg2]
// }

// foo1(1,'giles')

//泛型概念：所谓的泛型是指：在定义函数、接口、类的时候，不去明确类型具体是什么，但是在调用的时候才决定类型是什么的这么一种情况称为泛型
/*
    1、泛型在函数中的应用
    语法：
    function 函数名<T>(参数名:T):T{

    }
*/

function foo1<T>(arg1:T,arg2:T):T[]{
    return [arg1,arg2]
}

foo1<number>(10,20)
foo1<string>('张三','李四')


function foo2<T,U>(arg1:T,arg2:U):(T|U)[]{
    return [arg1,arg2]
}
foo2<string,number>("Giles",1)

